/**
 * @description 用于全局守卫，一个自定义的 JWT 认证守卫，用于拦截未携带 token 的请求。
 * 如果对应接口使用了@Public装饰器，则会绕过该守卫。
 */
import { ExecutionContext, Injectable } from '@nestjs/common'
import { AuthGuard } from '@nestjs/passport'
import { Reflector } from '@nestjs/core'
import { Observable } from 'rxjs'
import { IS_PUBLIC_KEY } from '../common/public.decorator'

@Injectable()
export class jwtAuthGuard extends AuthGuard('jwt') {
  constructor(private reflector: Reflector) {
    super()
  }

  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    // 检查公共路由

    // 检查是否是公共路由，装饰器
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
      context.getHandler(),
      context.getClass(),
    ])
    console.log(isPublic, 'isPublic')

    // 放行公共路由
    if (isPublic) return true

    // 验证 JWT
    return super.canActivate(context)
  }
}
